home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / cprog / lineclip.lha / CLIP2D.MOD < prev    next >
Encoding:
Modula Implementation  |  1992-02-29  |  10.8 KB  |  516 lines

  1. IMPLEMENTATION MODULE clip2d;
  2.  
  3. VAR
  4.   code : CARDINAL;
  5.  
  6. PROCEDURE clip2d(VAR px,py,qx,qy : INTEGER): BOOLEAN;
  7.  
  8. PROCEDURE ClipPBottom;
  9. BEGIN
  10.   px := (qx - px)*(YBottom - py) DIV (qy - py) + px;
  11.   py := YBottom;
  12. END ClipPBottom;
  13.  
  14. PROCEDURE ClipPTop;
  15. BEGIN
  16.   px := (qx - px)*(YTop - py) DIV (qy - py) + px;
  17.   py := YTop;
  18. END ClipPTop;
  19.  
  20. PROCEDURE ClipPRight;
  21. BEGIN
  22.   py := (qy - py)*(XRight - px) DIV (qx - px) + py;
  23.   px := XRight;
  24. END ClipPRight;
  25.  
  26. PROCEDURE ClipPLeft;
  27. BEGIN
  28.   py := (qy - py)*(XLeft - px) DIV (qx - px) + py;
  29.   px := XLeft;
  30. END ClipPLeft;
  31.  
  32. PROCEDURE ClipQBottom;
  33. BEGIN
  34.   qx := (px - qx)*(YBottom - qy) DIV (py - qy) + qx;
  35.   qy := YBottom;
  36. END ClipQBottom;
  37.  
  38. PROCEDURE ClipQTop;
  39. BEGIN
  40.   qx := (px - qx)*(YTop - qy) DIV (py - qy) + qx;
  41.   qy := YTop;
  42. END ClipQTop;
  43.  
  44. PROCEDURE ClipQRight;
  45. BEGIN
  46.   qy := (py - qy)*(XRight - qx) DIV (px - qx) + qy;
  47.   qx := XRight;
  48. END ClipQRight;
  49.  
  50. PROCEDURE ClipQLeft;
  51. BEGIN
  52.   qy := (py - qy)*(XLeft - qx) DIV (px - qx) + qy;
  53.   qx := XLeft;
  54. END ClipQLeft;
  55.  
  56. BEGIN
  57.   code := 0;
  58.   
  59.   IF qy > YBottom THEN
  60.     INC(code,8);
  61.   ELSIF qy < YTop THEN
  62.     INC(code,4);
  63.   END;
  64.  
  65.   IF qx > XRight THEN
  66.     INC(code,2);
  67.   ELSIF qx < XLeft THEN
  68.     INC(code,1);
  69.   END;
  70.  
  71.   IF py > YBottom THEN
  72.     INC(code,128);
  73.   ELSIF py < YTop THEN
  74.     INC(code,64);
  75.   END;
  76.  
  77.   IF px > XRight THEN
  78.     INC(code,32);
  79.   ELSIF px < XLeft THEN
  80.     INC(code,16);
  81.   END;
  82.   
  83.   CASE code OF
  84.  
  85.    (**************  From Center ***************)
  86.  
  87.     00H : RETURN TRUE;
  88.   | 01H : ClipQLeft; 
  89.           RETURN TRUE;
  90.   | 02H : ClipQRight; 
  91.           RETURN TRUE;
  92.   | 04H : ClipQTop;
  93.           RETURN TRUE;
  94.   | 05H : ClipQLeft;
  95.           IF qy < YTop THEN
  96.             ClipQTop;
  97.           END;
  98.           RETURN TRUE;
  99.   | 06H : ClipQRight;
  100.           IF qy < YTop THEN
  101.             ClipQTop;
  102.           END;
  103.           RETURN TRUE;
  104.   | 08H : ClipQBottom;
  105.           RETURN TRUE;
  106.   | 09H : ClipQLeft;
  107.           IF qy > YBottom THEN
  108.             ClipQBottom;
  109.           END;
  110.           RETURN TRUE;
  111.   | 0AH : ClipQRight;
  112.           IF qy > YBottom THEN
  113.             ClipQBottom;
  114.           END;
  115.           RETURN TRUE;
  116.  
  117.   (**************  From Left ***************)
  118.  
  119.   | 10H : ClipPLeft;
  120.           RETURN TRUE;
  121.   | 11H : RETURN FALSE;
  122.   | 12H : ClipPLeft;
  123.           ClipQRight;
  124.           RETURN TRUE;
  125.   | 14H : ClipPLeft;
  126.           IF py < YTop THEN
  127.             RETURN FALSE;
  128.           ELSE
  129.             ClipQTop;
  130.             RETURN TRUE;
  131.           END;
  132.   | 15H : RETURN FALSE;
  133.   | 16H : ClipPLeft;
  134.           IF py < YTop THEN
  135.             RETURN FALSE;
  136.           ELSE
  137.             ClipQTop;
  138.             IF qx > XRight THEN
  139.               ClipQRight;
  140.             END;
  141.             RETURN TRUE;
  142.           END;
  143.   | 18H : ClipPLeft;
  144.           IF py > YBottom THEN
  145.             RETURN FALSE;
  146.           ELSE
  147.             ClipQBottom;
  148.             RETURN TRUE;
  149.           END;
  150.   | 19H : RETURN FALSE;
  151.   | 1AH : ClipPLeft;
  152.           IF py > YBottom THEN
  153.             RETURN FALSE;
  154.           ELSE
  155.             ClipQBottom;
  156.             IF qx > XRight THEN
  157.               ClipQRight;
  158.             END;
  159.             RETURN TRUE;
  160.           END;
  161.  
  162.   (**************  From Right ***************)
  163.  
  164.   | 20H : ClipPRight;
  165.           RETURN TRUE;
  166.   | 21H : ClipPRight;
  167.           ClipQLeft;
  168.           RETURN TRUE;
  169.   | 22H : RETURN FALSE;
  170.   | 24H : ClipPRight;
  171.           IF py < YTop THEN
  172.             RETURN FALSE;
  173.           ELSE
  174.             ClipQTop;
  175.             RETURN TRUE;
  176.           END;
  177.   | 25H : ClipPRight;
  178.           IF py < YTop THEN
  179.             RETURN FALSE;
  180.           ELSE
  181.             ClipQTop;
  182.             IF qx < XLeft THEN
  183.               ClipQLeft;
  184.             END;
  185.             RETURN TRUE;
  186.           END;
  187.   | 26H : RETURN FALSE;
  188.   | 28H : ClipPRight;
  189.           IF py > YBottom THEN
  190.             RETURN FALSE;
  191.           ELSE
  192.             ClipQBottom;
  193.             RETURN TRUE;
  194.           END;
  195.   | 29H : ClipPRight;
  196.           IF py > YBottom THEN
  197.             RETURN FALSE;
  198.           ELSE
  199.             ClipQBottom;
  200.             IF qx < XLeft THEN
  201.               ClipQLeft;
  202.             END;
  203.             RETURN TRUE;
  204.           END;
  205.   | 2AH : RETURN FALSE;
  206.    
  207.   (**************  From Top ***************)
  208.  
  209.   | 40H : ClipPTop;
  210.           RETURN TRUE;
  211.   | 41H : ClipPTop;
  212.           IF px < XLeft THEN
  213.             RETURN FALSE;
  214.           ELSE
  215.             ClipQLeft;
  216.             IF qy < YTop THEN
  217.               ClipQTop;
  218.             END;
  219.             RETURN TRUE;
  220.           END;
  221.   | 42H : ClipPTop;
  222.           IF px > XRight THEN
  223.             RETURN FALSE;
  224.           ELSE
  225.             ClipQRight;
  226.             RETURN TRUE;
  227.           END;
  228.   | 44H : RETURN FALSE;
  229.   | 45H : RETURN FALSE;
  230.   | 46H : RETURN FALSE;
  231.   | 48H : ClipPTop;
  232.           ClipQBottom;
  233.           RETURN TRUE;
  234.   | 49H : ClipPTop;
  235.           IF px < XLeft THEN
  236.             RETURN FALSE;
  237.           ELSE
  238.             ClipQLeft;
  239.             IF qy > YBottom THEN
  240.               ClipQBottom;
  241.             END;
  242.             RETURN TRUE;
  243.           END;
  244.   | 4AH : ClipPTop;
  245.           IF px > XRight THEN
  246.             RETURN FALSE;
  247.           ELSE
  248.             ClipQRight;
  249.             IF qy > YBottom THEN
  250.               ClipQBottom;
  251.             END;
  252.             RETURN TRUE;
  253.           END;
  254.  
  255.   (**************  From Bottom ***************)
  256.  
  257.   | 50H : ClipPLeft;
  258.           IF py < YTop THEN
  259.             ClipPTop;
  260.           END;
  261.           RETURN TRUE;
  262.   | 51H : RETURN FALSE;
  263.   | 52H : ClipQRight;
  264.           IF qy < YTop THEN
  265.             RETURN FALSE;
  266.           ELSE
  267.             ClipPTop;
  268.             IF px < XLeft THEN
  269.               ClipPLeft;
  270.             END;
  271.             RETURN TRUE;
  272.           END;
  273.   | 54H : RETURN FALSE;
  274.   | 55H : RETURN FALSE;
  275.   | 56H : RETURN FALSE;
  276.   | 58H : ClipQBottom;
  277.           IF qx < XLeft THEN
  278.             RETURN FALSE;
  279.           ELSE
  280.             ClipPTop;
  281.             IF px < XLeft THEN
  282.               ClipPLeft;
  283.             END;
  284.             RETURN TRUE;
  285.           END;
  286.   | 59H : RETURN FALSE;
  287.   | 5AH : ClipPLeft;
  288.           IF py > YBottom THEN
  289.             RETURN FALSE;
  290.           ELSE
  291.             ClipQRight;
  292.             IF qy < YTop THEN
  293.               RETURN FALSE;
  294.             ELSE
  295.               IF py < YTop THEN
  296.                 ClipPTop;
  297.               END;
  298.               IF qy > YBottom THEN
  299.                 ClipQBottom;
  300.               END;
  301.               RETURN TRUE;
  302.             END;
  303.           END;
  304.  
  305.   (**************  From Lower Right ***************)
  306.  
  307.   | 60H : ClipPRight;
  308.           IF py < YTop THEN
  309.             ClipPTop;
  310.           END;
  311.           RETURN TRUE;
  312.   | 61H : ClipQLeft;
  313.           IF qy < YTop THEN
  314.             RETURN FALSE;
  315.           ELSE
  316.             ClipPTop;
  317.             IF px > XRight THEN
  318.               ClipPRight;
  319.             END;
  320.             RETURN TRUE;
  321.           END;
  322.   | 62H : RETURN FALSE;
  323.   | 64H : RETURN FALSE;
  324.   | 65H : RETURN FALSE;
  325.   | 66H : RETURN FALSE;
  326.   | 68H : ClipQBottom;
  327.           IF qx > XRight THEN
  328.             RETURN FALSE;
  329.           ELSE
  330.             ClipPRight;
  331.             IF py < YTop THEN
  332.               ClipPTop;
  333.             END;
  334.             RETURN TRUE;
  335.           END;
  336.   | 69H : ClipQLeft;
  337.           IF qy < YTop THEN
  338.             RETURN FALSE;
  339.           ELSE
  340.             ClipPRight;
  341.             IF py > YBottom THEN
  342.               RETURN FALSE;
  343.             ELSE
  344.               IF qy > YBottom THEN
  345.                 ClipQBottom;
  346.               END;
  347.               IF py < YTop THEN
  348.                 ClipPTop;
  349.               END;
  350.               RETURN TRUE;
  351.             END;
  352.           END;
  353.   | 6AH : RETURN FALSE;
  354.  
  355.   (**************  From Bottom ***************)
  356.    
  357.   | 80H : ClipPBottom;
  358.           RETURN TRUE;
  359.   | 81H : ClipPBottom;
  360.           IF px < XLeft THEN
  361.             RETURN FALSE;
  362.           ELSE
  363.             ClipQLeft;
  364.             RETURN TRUE;
  365.           END;
  366.   | 82H : ClipPBottom;
  367.           IF px > XRight THEN
  368.             RETURN FALSE;
  369.           ELSE
  370.             ClipQRight;
  371.             RETURN TRUE;
  372.           END;
  373.   | 84H : ClipPBottom;
  374.           ClipQTop;
  375.           RETURN TRUE;
  376.   | 85H : ClipPBottom;
  377.           IF px < XLeft THEN
  378.             RETURN FALSE;
  379.           ELSE
  380.             ClipQLeft;
  381.             IF qy < YTop THEN
  382.               ClipQTop;
  383.             END;
  384.             RETURN TRUE;
  385.           END;
  386.   | 86H : ClipPBottom;
  387.           IF px > XRight THEN
  388.             RETURN FALSE;
  389.           ELSE
  390.             ClipQRight;
  391.             IF qy < YTop THEN
  392.               ClipQTop;
  393.             END;
  394.             RETURN TRUE;
  395.           END;
  396.   | 88H : RETURN FALSE;
  397.   | 89H : RETURN FALSE;
  398.   | 8AH : RETURN FALSE;
  399.  
  400.   (**************  From Bottom ***************)
  401.  
  402.   | 90H : ClipPLeft;
  403.           IF py > YBottom THEN
  404.             ClipPBottom;
  405.           END;
  406.           RETURN TRUE;
  407.   | 91H : RETURN FALSE;
  408.   | 92H : ClipQRight;
  409.           IF qy > YBottom THEN
  410.             RETURN FALSE;
  411.           ELSE
  412.             ClipPBottom;
  413.             IF px < XLeft THEN
  414.               ClipPLeft;
  415.             END;
  416.             RETURN TRUE;
  417.           END;
  418.   | 94H : ClipQTop;
  419.           IF qx < XLeft THEN
  420.             RETURN FALSE;
  421.           ELSE
  422.             ClipPLeft;
  423.             IF py > YBottom THEN
  424.               ClipPBottom;
  425.             END;
  426.             RETURN TRUE;
  427.           END;
  428.   | 95H : RETURN FALSE;
  429.   | 96H : ClipPLeft;
  430.           IF py < YTop THEN
  431.             RETURN FALSE;
  432.           ELSE
  433.             ClipQRight;
  434.             IF qy > YBottom THEN
  435.               RETURN FALSE;
  436.             ELSE
  437.               IF py > YBottom THEN
  438.                 ClipPBottom;
  439.               END;
  440.               IF qy < YTop THEN
  441.                 ClipQTop;
  442.               END;
  443.               RETURN TRUE;
  444.             END;
  445.           END;
  446.   | 98H : RETURN FALSE;
  447.   | 99H : RETURN FALSE;
  448.   | 9AH : RETURN FALSE;
  449.  
  450.   (**************  From Bottom ***************)
  451.  
  452.   | 0A0H : ClipPRight;
  453.            IF py > YBottom THEN
  454.              ClipPBottom;
  455.            END;
  456.            RETURN TRUE;
  457.   | 0A1H : ClipQLeft;
  458.            IF qy > YBottom THEN
  459.              RETURN FALSE;
  460.            ELSE
  461.              ClipPBottom;
  462.              IF px > XRight THEN 
  463.                ClipPRight;
  464.              END;
  465.              RETURN TRUE;
  466.            END;
  467.   | 0A2H : RETURN FALSE;
  468.   | 0A4H : ClipQTop;
  469.            IF qx > XRight THEN
  470.              RETURN FALSE;
  471.            ELSE
  472.              ClipPRight;
  473.              IF py > YBottom THEN
  474.                ClipPBottom;
  475.              END;
  476.              RETURN TRUE;
  477.            END;
  478.   | 0A5H : ClipQLeft;
  479.            IF qy > YBottom THEN
  480.              RETURN FALSE;
  481.            ELSE
  482.              ClipPRight;
  483.              IF py < YTop THEN
  484.                RETURN FALSE;
  485.              ELSE
  486.                IF qy < YTop THEN
  487.                  ClipQTop;
  488.                END;
  489.                IF py > YBottom THEN
  490.                  ClipPBottom;
  491.                END;
  492.                RETURN TRUE;
  493.              END;
  494.            END;
  495.   | 0A6H : RETURN FALSE;
  496.   | 0A8H : RETURN FALSE;
  497.   | 0A9H : RETURN FALSE;
  498.   | 0AAH : RETURN FALSE;
  499.  
  500.   (************** Error Trap ***************)
  501.  
  502.   ELSE  (* Undefined Code *)
  503.  
  504.     RETURN FALSE;
  505.  
  506.   END; (* CASE code *)
  507.  
  508. END clip2d;
  509.  
  510. BEGIN
  511.   XLeft   := 0;
  512.   XRight  := 319;
  513.   YTop    := 0;
  514.   YBottom := 199;
  515. END clip2d.
  516.